#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
重命名工具 - 修复文件名中的重复扩展名

功能：
1. 修复文件名中的重复后缀（如 file.pdf.pdf -> file.pdf)
2. 批量处理目录中的文件
3. 支持试运行模式
"""

import os
import logging
from pathlib import Path
from typing import List

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def fix_duplicate_extension(filename: str) -> str:
    """
    修复文件名中的重复后缀
    
    Args:
        filename: 原始文件名
        
    Returns:
        str: 修复后的文件名
    """
    # 获取文件名和扩展名
    name, ext = os.path.splitext(filename)
    
    # 如果扩展名为空，直接返回原文件名
    if not ext:
        return filename
    
    # 检查是否有重复的扩展名
    # 例如：file.pdf.pdf -> file.pdf
    while True:
        new_name, new_ext = os.path.splitext(name)
        if new_ext == ext:
            name = new_name
        else:
            break
    
    # 重新组合文件名
    return name + ext

def rename_file_with_fixed_extension(file_path: str) -> bool:
    """
    重命名文件，修复重复扩展名
    
    Args:
        file_path (str): 文件路径
        
    Returns:
        bool: 是否成功重命名
    """
    try:
        file_dir = os.path.dirname(file_path)
        file_name = os.path.basename(file_path)
        
        # 修复文件名
        fixed_name = fix_duplicate_extension(file_name)
        
        # 如果文件名没有变化，跳过
        if fixed_name == file_name:
            return True
        
        # 构造新文件路径
        new_file_path = os.path.join(file_dir, fixed_name)
        
        # 检查新文件名是否已存在
        if os.path.exists(new_file_path):
            logger.warning(f"目标文件已存在，跳过重命名: {new_file_path}")
            return False
        
        # 重命名文件
        os.rename(file_path, new_file_path)
        logger.info(f"成功重命名: {file_name} -> {fixed_name}")
        return True
        
    except Exception as e:
        logger.error(f"重命名文件 {file_path} 时出错: {str(e)}")
        return False

def find_files_with_duplicate_extensions(directory_path: str, extensions: List[str] = None) -> List[str]:
    """
    查找目录中有重复扩展名的文件
    
    Args:
        directory_path (str): 目录路径
        extensions (List[str]): 要检查的扩展名列表，默认为常见扩展名
        
    Returns:
        List[str]: 需要修复的文件路径列表
    """
    if extensions is None:
        extensions = ['.pdf', '.doc', '.docx', '.txt', '.jpg', '.png', '.mp4', '.mp3', '.zip', '.rar']
    
    files_to_fix = []
    
    if not os.path.exists(directory_path):
        logger.error(f"目录不存在: {directory_path}")
        return files_to_fix
    
    logger.info(f"搜索目录: {directory_path}")
    
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            file_path = os.path.join(root, file)
            
            # 检查文件是否有重复扩展名
            fixed_name = fix_duplicate_extension(file)
            if fixed_name != file:
                files_to_fix.append(file_path)
                logger.info(f"发现重复扩展名文件: {file}")
    
    logger.info(f"共找到 {len(files_to_fix)} 个需要修复的文件")
    return files_to_fix

def process_directory(directory_path: str, dry_run: bool = False) -> dict:
    """
    处理指定目录下的所有文件，修复重复扩展名
    
    Args:
        directory_path (str): 目录路径
        dry_run (bool): 是否为试运行模式
        
    Returns:
        dict: 处理结果统计
    """
    if not os.path.exists(directory_path):
        logger.error(f"目录不存在: {directory_path}")
        return {"error": "目录不存在"}
    
    # 统计信息
    stats = {
        "total_files": 0,
        "files_to_fix": 0,
        "renamed_files": 0,
        "skipped_files": 0,
        "errors": 0
    }
    
    # 查找需要修复的文件
    files_to_fix = find_files_with_duplicate_extensions(directory_path)
    stats["files_to_fix"] = len(files_to_fix)
    
    if not files_to_fix:
        logger.info("未找到需要修复的文件")
        return stats
    
    # 处理每个文件
    for i, file_path in enumerate(files_to_fix, 1):
        logger.info(f"正在处理 ({i}/{len(files_to_fix)}): {os.path.basename(file_path)}")
        
        try:
            if dry_run:
                # 试运行模式
                file_name = os.path.basename(file_path)
                fixed_name = fix_duplicate_extension(file_name)
                logger.info(f"[试运行] 将重命名: {file_name} -> {fixed_name}")
                stats["renamed_files"] += 1
            else:
                # 实际处理
                if rename_file_with_fixed_extension(file_path):
                    stats["renamed_files"] += 1
                else:
                    stats["skipped_files"] += 1
                    
        except Exception as e:
            logger.error(f"处理文件 {file_path} 时出错: {str(e)}")
            stats["errors"] += 1
    
    return stats

def main():
    """主函数 - 提供命令行接口"""
    import argparse
    
    parser = argparse.ArgumentParser(description="修复文件名中的重复扩展名")
    parser.add_argument("directory", help="要处理的目录路径")
    parser.add_argument("--dry-run", action="store_true", help="试运行模式，不实际重命名文件")
    
    args = parser.parse_args()
    
    print("重命名工具 - 修复重复扩展名")
    print(f"处理目录: {args.directory}")
    print(f"试运行模式: {'是' if args.dry_run else '否'}")
    print("-" * 60)
    
    # 处理文件
    stats = process_directory(args.directory, args.dry_run)
    
    # 打印统计结果
    print("\n" + "=" * 60)
    print("处理完成！统计结果:")
    print(f"需要修复的文件数: {stats.get('files_to_fix', 0)}")
    print(f"重命名文件数: {stats.get('renamed_files', 0)}")
    print(f"跳过文件数: {stats.get('skipped_files', 0)}")
    print(f"错误文件数: {stats.get('errors', 0)}")
    print("=" * 60)

if __name__ == "__main__":
    # 简化的交互式使用
    if len(os.sys.argv) == 1:
        print("重命名工具 - 修复重复扩展名")
        print("=" * 40)
        
        # 获取目录路径
        directory = input("请输入要处理的目录路径 (直接回车使用当前目录): ").strip()
        if not directory:
            directory = "."  # 默认当前目录
        
        # 确认是否试运行
        dry_run_input = input("是否试运行模式？(y/N，直接回车开始实际处理): ").strip().lower()
        dry_run = dry_run_input in ['y', 'yes', '是']
        
        print(f"\n重命名工具 - 修复重复扩展名")
        print(f"处理目录: {directory}")
        print(f"试运行模式: {'是' if dry_run else '否'}")
        print("-" * 60)
        
        # 处理文件
        stats = process_directory(directory, dry_run)
        
        # 打印统计结果
        print("\n" + "=" * 60)
        print("处理完成！统计结果:")
        print(f"需要修复的文件数: {stats.get('files_to_fix', 0)}")
        print(f"重命名文件数: {stats.get('renamed_files', 0)}")
        print(f"跳过文件数: {stats.get('skipped_files', 0)}")
        print(f"错误文件数: {stats.get('errors', 0)}")
        print("=" * 60)
    else:
        main()